Когда разговор заходит о многопоточности, то нужно сразу отметить, какие типы задач интересуют.
Если речь идет о CPU-bound задачах, и надо нагрузить многоядерный процессор, то да GIL мешает (даже запрещает), и в Python надо компилировать расширение или использовать несколько процессов.
Если же дело в IO-bound - это практически все задачки связянные с сетью, включая веб, - то, как правило, блокирующая операция ожидания ответа от сети освобождает GIL и можно спокойно использовать многопоточность.
Другое дело, что сейчас многие советуют использовать именно асинхронные фреймворки (тот же asyncio), которые для сетевых задач дают гораздо лучшую производительность, чем нативные потоки (хотя, вроде, greenlets еще лучше).