A forma de resolver é fruto da minha cadeira de Algorítimos na faculdade, onde utilizamos Fortran para fazer essa solução, aí sim a recursão pode ser muito melhor do que em linguagens como Javascript e afins. Na maior parte das vezes utilizar iteração vai ser mais rápido mesmo, mas eu acho mais elegante utilizar recursão, puro gosto mesmo.
Normalmente essas otimizações que você falou são feitas a nível de compilação, o próprio compilador faz isso para nós, pois um código muito otimizado tende a ser menos legível, especialmente quando estamos falando de matemática computacional. Lembrando que dificilmente bibliotecas com ferramentais matemáticos vão ser escritas em linguagens como Python ou Javascript, o que ocorre normalmente é escrever essas funções em C, C++ e outras linguagens de mais baixo nível e então disponibilizar para uma ser utilizada por uma linguagem de alto nível. Isso ocorre por vários fatores, principalmente o fator de que rodar um binário diretamente é muito mais rápido do que rodar um interpretador que compila em tempo real por exemplo, além de que o processo de compilação consegue otimizar muito o código.
Um exemplo para isso é a biblioteca Numpy do Python que é feita grande parte em C e é isso que faz com que seja rápida e otimizada. Por exemplo, construir uma Array com 1 milhão de elementos aleatórios e somar todos eles depois é imensamente mais rápido utilizando as funcionalidades do numpy do que com as próprias funcionalidades nativas do Python.
Mesmo iterando ainda assim não teríamos um resultado muito otimizado, saltos dentro da memória causam sempre um certo gargalo na aplicação. Isso serve tanto para recursão quanto para iteração, a cada chamada de função estamos fazendo mais e mais saltos dentro da memória o que causa lentidão. Em linguagens compiladas isso não é um problema, pois o próprio compilador se encarrega por otimizar, por exemplo substituindo a chamada da função pela própria função em cada local onde é chamada, removendo código morto, simplificando constantes, desdobrando laços de repetição e etc.
A minha solução na verdade não está completa, falta ajustar a precisão, de forma que consigamos garantir e definir quanto de erro teremos em relação ao valor real do seno. Eu poderia ter colocado apenas os valores exatos de cada fatorial, mas isso seria um problema para próximas implementações. A sua implementação é boa também, são várias formas de resolver o mesmo problema e você achou uma implementação até mais otimizada, porém um pouco menos legível. E programação é isso, saber negociar entre legibilidade e legibilidade. Parabéns pela implementação!