Собственно, всё уже объяснили. Код в первом посте хорош наглядностью. Но использует т.н. "древовидную рекурсию" (когда каждый вызов fib вызывает fib ещё 2 раза, те, в свою очередь - каждый ещё по 2, итд). Вот вам и тормоза. Собственно, то же самое получим при попытке этот код переписать дословно, скажем, на паскале или С.
Методов избавления от таких тормозов два. Первый - тот же, что императивных языках: мемоизация. Тут, правда, свои методы. Вот код в посте
neol использует именно мемоизацию. Определяемый в нём список fib - это бесконечный ленивый список, к моменту вычисления n-го элемента списка все предыдущие уже вычислены.
Кстати, ту же строчку можно записать покрасивее:
Другой метод "избавления от тормозов" специфичен для ФЯ: преобразование рекурсии к виду хвостовой рекурсии, такую компилятор развернёт в цикл.
Незнакомые термины см. в википедии ;)