Según lo solicitado por el OP , voy a participar (sin hacer el ridículo, con suerte: P)
Creo que todos estamos de acuerdo en que la recursividad es solo una forma más elegante de codificación. Si se hace bien, puede hacer que el código sea más fácil de mantener, lo cual es IMHO tan importante (si no más) que reducir 0.0001ms.
En lo que respecta al argumento de que JS no realiza la optimización de llamadas de cola: eso ya no es del todo cierto, el uso del modo estricto de ECMA5 habilita el TCO. Era algo de lo que no estaba muy contento hace un tiempo, pero al menos ahora sé por qué arguments.callee
arroja errores en modo estricto. Sé que el enlace de arriba enlaza con un informe de error, pero el error está configurado en WONTFIX. Además, viene el TCO estándar: ECMA6 (diciembre de 2013).
Instintivamente, y atendiendo a la naturaleza funcional de JS, diría que la recursión es el estilo de codificación más eficiente el 99.99% del tiempo. Sin embargo, Florian Margaine tiene razón cuando dice que es probable que se encuentre el cuello de botella en otro lugar. Si está manipulando el DOM, probablemente esté mejor enfocado en escribir su código lo más fácil de mantener posible. La API DOM es lo que es: lenta.
Creo que es casi imposible ofrecer una respuesta definitiva sobre cuál es la opción más rápida. Últimamente, muchos jspref que he visto muestran que el motor V8 de Chrome es ridículamente rápido en algunas tareas, que funcionan 4 veces más lento en SpiderMonkey de FF y viceversa. Los motores JS modernos tienen todo tipo de trucos bajo la manga para optimizar su código. No soy un experto, pero siento que V8, por ejemplo, está altamente optimizado para cierres (y recursividad), mientras que el motor JScript de MS no lo está. SpiderMonkey a menudo funciona mejor cuando el DOM está involucrado ...
En resumen: diría que la técnica que tendrá más rendimiento es, como siempre en JS, casi imposible de predecir.