I am calling rmtree() in DESTROY() method of a class
The error is due to the fact that the code is unable to stat the directory in question. Is the path canonical or relative? If it's relative, is your code's working directory where you think it is? Can you prove it (print getcwd)?
How are you generating your temp names? Could two threads create the same name?
In general, putting resource teardown code beyond closing a socket or the like in a DESTROY handler is a bit weird. I think you'll need to solve this with another a level of indirection. You have to go up a level and ask some parent code to clean up afterwards.
• another intruder with the mooring in the heart of the Perl