See also [RFC] Syncing Asm Goto with Outputs with GCC , which would lift the return value restrictions on callbr. You can always get around the issues with “return values” by just returning values in memory, though.
You can also always just emit a switch on the return value of a function to emulate “multiple destinations”, although that might not have the performance characteristics you want.