So sieht's aus!
Aber hast Du schon die unterschiedlichen Optimierungen versucht? Ich würde mit der Optimierung s (Space) anfangen. Es besteht Optimierungspotential bei den verwendeten Registern. Eigentlich käme der Compiler nämlich auch mit weniger als 5 Registern aus. Dann würdest Du einige Pushs usw. sparen und kämst so vielleicht in die Region von 25-31 Takte. Wenn Du dann noch als erstes in der ISR den Timer ausschaltest, und den OCR1 Wert auf 32-(optimierte Taktzahl) einstellst), also irgendwas zwischen 1-10, dann könnte es gehen.
Ansnonsten sehe ich gerade nur die Möglichkeit, das Programm in Assembler zu schreiben. Dann kannst Du Dir die ganzen Pushs und Pops sparen. Das müsste gehen, wenngleich dann auch nicht mehr viel weiteres geht.
Möglicherweise kannst Du auch (zb mit Inline Assembler) in C die ISR umgehen, indem Du statt des Funktionsaufrufs den Sprung selbst nutzt. Keine Ahnung ob und wie sowas geht. Vielleicht weiß das wer anders...
Gruß