I think there are bugs in the way delayMicroseconds() works. That code is old and I don't understand it well, but I believe there may be a problem in the way we convert microseconds to busy-loop iterations (using STM32_DELAY_US_MULT in the current libmaple from Git). I seem to recall gbulmer picking apart the cycle timings in a post from a long time ago, so I'll try to dig it up and see if I can't find the bug. If anyone else wants to take a look at this, though, I'd really appreciate it.
The problem with a spin-loop for delayMicroseconds() is the jitter introduced by interrupts from systick, USB, and in this (IRremote) case the 50us-timer interrupt. For long delays (2400 us), then there are many cycles stolen from the spin-loop, and actual elapsed time will be longer than requested.
There was another blog about passing 0 to delayMicroseconds() -- IRremote lib does make 0us requests in transmits for some IR devices -- and that is a problem with the delayMicroseconds() implementation because it does a us-- initially to account for function overhead ...