Handling timer overflow and compare interrupts in ATMega328 (Arduino)
I am not fully sure as to why, but using fast pwm mode instead of normal mode seems to fix this problem.

Use the same code, but replacing

TCCR2A = 0x00;


with 

TCCR2A = _BV(WGM20)|_BV(WGM21);


I would also ask why you seem to be clearing asynchronous mode both upon entering and leaving pwm mode, but it does not seem to affect anything.