instruction at the interrupt vector doesn't change. The program keeps track, in SRAM, of which program is associated with the interrupt. When the interrupt fires, the program fetches that data, and decides which code to execute. I can't tell for certain exactly how it works, but it looks to me like the ISR fetches a pointer to the function that was last named in attachInterrupt(). Maybe someone more erudite than I will chime in and clarify it.
You could do something similar, without resorting to attachInterrupt() and detachInterrupt(), with something like this - pseudocode, with break
case 1: do something;
case 2: do something else;
case 3: do yet a another thing;