An interesting application of this is massaging the branch predictor using tail calls to speed up a parser/interpreter:
https://blog.reverberate.org/2021/04/21/musttail-efficient-i...
https://blog.reverberate.org/2021/04/21/musttail-efficient-i...
A traditional switch/goto loop can thrash the branch predictor. Separating into different tail calling functions gives you more slots and allows the branch predictor to learn relationships between ops.
Not to discount the many other benefits of tail calls.
*Edit: I misspoke slightly, computed gotos can also split the patch jump, but less reliably[0].