from itertools import zip_longest
l = ['2018-01-01', 'yandex', 'cpc', 100]
for z in zip_longest(*[iter(l)] * 4):
first, second, third, forth = z
print({first:{second:{third:forth}}})
Гнаться за актуальностью странная идея. Мне не очень нравится Tornado, но это проверенное временем решение, для каких-то задач может быть нормальным выбором.
Смотрите в первую очередь на БД, базы в контейнере требуют особых приседаний.
Если все это крутится на одной машине, то нужно задуматься о том, чтобы вынести БД на отдельный хост.
А вы измерьте время с использованием doctrine и без, и получите ответ. То, что join не бесплатный это факт, насколько именно, зависит от конкретной задачи.