Ну в последнем варианте у вас вроде нет вывода. Так что что там будет при раскрутке рекурсии - мне не понятно. В первых двух разница есть довольно большая. В первом случае происходит проверка - если элемент List, то нырять глубже и она очевидна, во втором вы проверяете какой-то флаг ($list['closureTag']), который в вопросе вроде не описан, поэтому сказать какие элементы пройдут проверку я не могу.
UPD: Код сильно переписан, так что мой ответ по большой части не актуален, но всеже внесу правки. Заметьте что в первом коде не используются ни индексы, ни строковые константы. Знаете почему? потому что любая опечатка и сразу - "Счастливой отладки". Поддерживать такое тоже сложно, потому что переименовывать поля становится весело и задорно. Хрен знает где они использовались в старом виде. Далее - в чем главный баг. У вас вывод делается ТОЛЬКО если у узла нет наследников. Т.е. вы выводите только кончики. Это правильно?