Вы сами себе противоречите:
Как организовать проект таким образом чтобы при разработке модулей для него не требовался сам проект?
Модуль для своей работы дёргает контроллеры из основного проекта.
Получается, что ваш модуль не сможет работать без проекта. Вообще.
Мне кажется, что модули вам стоит делать более мелкими, чтобы они решали только какую-то определенную небольшую задачу.
Посмотрите в сторону того, как устроен механизм Middleware в Django - есть список middleware и запрос последовательно передается в каждый из них, а возвращаемый модифицированный запрос передается в следующий.
По поводу доступа в базу, тоже хороший пример - Django. При инициализации открывается соединение с базой и кладется в некое хранилище конфигураций, откуда можно его взять модулям и использовать. Так, при обособленной разработке модулей, можно будет подложить свое, но в собранном проекте будет использоваться глобальное, что сократит время на открытие соединения.
Для того, чтобы выстроить разработку таких модулей - обозначьте четкий интерфейс каждого типа модуля. Например, модули отвечающий за работу с пользователем, получают на вход объект пользователя и отдают тоже объект пользователя, но либо делают что-то по дороге, либо как-то модифицируют его.