If you look at it from the perspective of continuations then tail calls are very natural. A function call is always a goto, the only difference is that calls in tail position do not need to add extra data to the continuation.
Instead you want to use constructs that are familiar and easy to reason about. It's hard to beat a for loop.