You should be just fine, we have countless SPs here that get run 1000s of times a day with temp tables that are named the same and don't have any issues.
Here's a visual example. I've created 2 tables on my SQL2014 instance. One was created from SPID 53, the other from SPID 57. Here's what it looks like in Object Explorer:
As you can see, though they are 'named' the same, at the very end, there's a lovely set of characters that make the tables different. The only difference is I executed the CREATE statements from different query windows. This is just a visual way of showing it. When you query the #tmp table, you only query the table that applies to your session.
I will make one suggestion, though. It's something that I'm completely guilty of and I'm working on transitioning to. Use
sp_executesql instead of
EXEC(). Aaron Bertrand wrote this as one of the 'Bad Habits to Kick'. Here's a link to it: http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/17/bad-habits-to-kick-using-exec-instead-of-sp-executesql.aspx
Basically, using sp_executesql will reduce the chance of SQL injection and there's a higher chance that the execution plan can get re-used. Aaron goes into much more detail in the article, but that's the 1000-foot-view.