This smells like a unix issue with usleep.
The perl Time::HiRes module is implemented over the unix usleep function, which uses the real-time timer of the process. Each unix process has only one real-time timer. Now, what happens is that if Apache server has already setup the real-time timer for the cgi process, subsequent calls in the perl script to usleep will have no effect.
Have you timed the usleep function to see if it has really suspended the process by 2 seconds?