Probably because people have concluded that programmers suck at explicitly specifying optimizations, so much so that things like "inline" don't guarantee inlining in certain languages. Furthermore tail recursion elimination can happen as an optimization even when the source isn't clearly tail recursive. For example, GCC can optimize this:
int factorial(int x) {
if (x > 1) return x * factorial(x-1);
else return 1;
}
to this: int factorial(int x) {
int result = 1;
while (x > 1) result *= x--;
return result;
}
(See http://ridiculousfish.com/blog/posts/will-it-optimize.html for other fun optimizations.)