Даже с демо-версией вы можете зарегистрироваться и скачать обновления.
Насчет вашего скрипта - вполне возможно, что не слишком оптимальные параметры методов CIBlockSection::Add и CIBlockElement::Add.
В методе CIBlockSection::Add параметр bResort - позволяет не пересчитывать вложенность разделов, а параметр bUpdateSearch - не обновлять поисковый индекс. Вложенность можно пересчитать одной операцией для всего инфоблока, используя метод CIBlockSection::Resort.
Аналогично, в методе CIBlockElement::Add не следует обновлять поисковый индекс (параметр bUpdateSearch).
Стоит также уточнить, каким образом вы определяете наличие или отсутствие конкретного элемента в базе (для целей обновления записи) - это некий кэш в памяти или каждый раз выполняется CIBlockElement::GetList. Не следует забывать, что CIBlockElement::GetList имеет параметр arSelectFields - он управляет составом полей, включаемый в выборку. К тому же есть параметр arGroupBy, указав в котором пустой массив можно узнать, а есть ли элементы, удовлетворяющие установленному фильтру.
Если все это оптимально применить - не так уж сильно будет отличаться производительность от прямой вставки в базу