Интересная проблема.
В общем случае время выполнения запроса никак не зависит от того локальный он или удаленный.
Могут быть микро потери времени на передачу самого запроса (если он реально длинный) и заметные потери времени на передачу ответа (опять же если он огромный).
По пунктам того что Вы пишите:
Если подключаться к удаленной базе и выбирать данные напрямую, то происходит ситуация, когда коннекты висят по несколько минут, забивая все доступные подключения и пропускная способность получается очень низкой.
Запросы реально исполняются несколько минут? Какой объем данных передается в ответе? Какой канал между серверами, не забивается ли он? Потребление памяти/процессора на SQL сервере в момент выполнения запроса?
Есть тупая идея увеличить max_connections, но я сомневаюсь что в Вашем случае это поможет, скорее всего проблема не в этом.
Это при том, что подключение к удаленной БД происходит прямо перед запросом, а закрытие подключения сразу после.
Можно так же попробовать использовать persistent connection, не будет оверхеда на постоянные подключения/отключения.
Возможно надо посмотреть в сторону оптимизации самих запросов, дробления их на части итд.