Если у вас есть набор функций (методов), которые работают с набором объектов, которые не должны быть видны другим функциям за пределами этого набора, то было бы естественным поместить этот набор функций и объектов в класс.
Должен существовать глобальный контроллер, который позволяет взаимодействовать между различными модулями, обеспечивая доступ к их экземплярам
Должен ли быть глобальный контроллер? Это звучит очень похоже на анти-паттерн "Объект Бога". Даже если у вас обычно есть только один экземпляр каждого из ваших классов, они не обязательно должны быть членами общего класса контроллера, если функции различных классов, которым требуется доступ к другим классам, могут получить этот доступ.
Взаимодействие между модулями может привести к дополнительным накладным расходам на вызов функции и 1-2 разыменования указателя
Я не уверен, как вы с этим справились. Я не верю, что это должно быть так, но я бы порекомендовал вам сначала спроектировать для ясности, а оптимизировать, только если производительность не адекватна.