Нет, это не из-за GIL.
Создавать количество тредов по количеству страниц неправильно. Создание треда - трудоёмкая задача для ОС.
И правильно ли я вообще делаю?
Не совсем правильно, правильнее использовать то, что уже есть.
Если scrapy тебя не устраивает, ты можешь использовать ThreadPool'ы, вместо того, чтобы вручную управлять lowlevel api тредов. Примерно так:
from concurrent.futures import ThreadPoolExecutor
from requests import Session
session = Session()
urls = [
'https://toster.ru/q/372757',
'https://toster.ru/',
]
with ThreadPoolExecutor(7) as pool: # 7 - количество тредов
for response in pool.map(session.get, urls):
do_something_with_response(response)