A key aim with interrupt routines, especially on chips with lots of registers and no "load/save multiple register" instruction, is to avoid (non-inlined) function calls - it makes a huge difference.
Have you ever used a COP8 microcontroller? The overhead in figuring out which interrupt occurred, stacking the basic registers (even though there are only three of them), and jumping to the real interrupt routine was typically something like 40 instruction cycles. You had the same again for the exit. And each instruction cycles was ten clock cycles, with a 10 MHz maximum clock. So you have close to 0.1 ms overhead for an interrupt - it makes the AVR's interrupts seem lightning fast.
Also note that the newer X Megas have DMA and an "event" system that lets you do quite a bit of action without needing interrupts.