Не очень понятно, почему при удалении массивов и переменных пиковое использование памяти скриптом растёт.
Потому что unset не удаляет ничего, а добавляет в zval новые данные - флаг удаления, для того, чтобы GC смог подчистить их при следующем запуске (Хотя это тоже не так, GC в пыхе почти ничего не подчищает, а просто перезаписывает поверх, т.к. аллокации памяти требуют времени).
А сама операция unset нужна лишь для того, чтобы корректно убирать данные в реалтайм (т.е. грубо говоря while true) приложениях, если нет уверенности в том, что refcount после отработки кода у zval будет равен 0. Если же в приложении нет никакого эвентлупа, то использование unset и gc_collect_cycles будет лишь добавлять тормозов и пиков потребления памяти.
Это не абсолютная истина, конечно. Но лучше доверить менеджмент памяти именно PHP. Но например, в приведённом выше коде, который устарел лет на 10 и сейчас просто не будет работать - после последней строчки не останется вообще никаких переменных в памяти. Точнее они останутся, но с refcount = 0, а значит создание новой переменной просто перезапишет уже выделенную память.