Сейчас передача реализована в виде костыля из большой структуры, которая заполняется по таймеру данными из каждой функции и в дальнейшем отправляется клиенту.
Почему это костыль?
Если клиенту все эти данные нужны только сразу - то большая структура вам нужна. Никуда вы не денетесь.
Единственно, что если вы хотите как-то эффективнее распараллелить это дело то лучше писать в структуру не по таймеру, а ждать данные из разных каналов в точке сбора структуры.