末尾再帰最適化というのはgotoをカッコ良さげに読んでみただけです。
haskellのlazinessやモナドの合成と相性が悪いのでそこは気をつけないといけませんが。