I've generally used an analog multiplexed switch (e.g. a 12-position rotary switch with a resistor between each terminal, +5 on one side, gnd on the other, and the wiper as signal) for autonomous modes.
I read the input from the source (currently a
uHID) then do some math to end up with an integer number, which I use to find the correct routine in an array. Since we store the routine as a string filename, I also send that filename back to the dashboard as the low priority string (the 'old style' binary string dashboard system).
I like keeping the robot in the feedback loop. The drive team occasionally complains about not being able to see the selected mode until the robot is booted up, but requiring the robot to confirm the selected mode is a much more failsafe option than selecting it and hoping the robot received it (IMO).