Do people often rely on tail-recursion for real-world programs?
Before anyone wonders if I know what it is, yes, I do, and yes, I've used it appropriately, but it feels so... academic.
If you wanted to, for example, write a new experimental functional language and reuse part of the Rust compiler to sanity check and generate the executable, then tail-recursion would be really important.
Similarly, if you create something like a parser generator and don't have tail recursion optimization, then you are going to run out of stack space before being able to parse stuff. So, there are lots of practical applications that depend on this feature too.