why use callbacks

There is no inherent equivalence between callbacks and interrupts.

We may have to agree to disagree. Both are mechanisms for execution of code out-of-sequence with the flow of the main program, so I see them as very similar. Perhaps you're only considering a simple case ala single-threaded Arduino, where the only way you can get to a callback is to explicitly call the function that invokes the callback, while I'm thinking of a more general case where ISRs and/or the OS can cause a callback when the running thread is least expecting it.

The Arduino attachInterrupt function puts its own code at the ROM-based vector that you talked about, but then invokes a callback that is provided by the user (function pointer, stored in RAM.) So essentially it implements a more refined/complex level of ISR even though the hardware is limited. I think I would have preferred a weak symbol, and to have had SerialEvent be a callback rather than a weak symbol, but...