Global temp tables are not the devil, but in your situation, I think they may be more trouble than they are worth. Since you are really trying to work around concurrency issues here, you are going to have to check if the global temp table already exists, if it does not, create it, but if it does, what do you do, wait? After waiting, you create it? At this point, a real table allowing you to use the SQL locking mechanism seems like a more logical approach to me.
I guess you could use sp_GetAppLock at the beginning of your procedure so it cannot be run by more than one connection at a time, but then why not bite the bullet and use a table. Again, if you use a GUID or some other kind of identifier, you could actually have concurrent executions with no wait and no conflict.