It depends on what you need to do.
RunWithElevated only runs as the Application Pool Identity, so you might not have access to other web applications, only other site collections in the current web application, but you can be guaranteed that you will be running as a user that exists (the AppPool identity).
With UserToken, you need to be sure that the user exists that you're impersonating, and that that user has the permissions already set up.
With Win32 P/Invoke to LogonUser, I'd imagine that the limitations are similar to UserToken.
Edit: I just remembered about SharePoint Designer 2010's "Impersonation Step".
With this, you can impersonate the user who created the workflow and have steps run as that user, within the workflow, without a single line of code. However, this only work as the person who published the Workflow, so care needs to be taken as to who does this, and what would happen to their account should that person leave the company (so do things like set up a dedicated 'application service account' for this purpose).