Насчет механизма подсчета ссылок и GIL подробно не расскажу, насколько я помню, он предотвращает ситуацию, когда два потока одновременно изменяют счетчик ссылок, что может привести к некорректным результатам.
Также GIL используется для правильной работы структур list, dict, set. На примере работы list:
https://habr.com/ru/post/273045/. Вставка элемента в позицию x требует смещения некоторых элементов списка, например, если мы хотим вставить элемент в середину списка, то перед вставкой интерпретатору нужно будет сдвинуть второю половину листа. Теперь представим ситуацию, есть список в котором 10 элементов, один поток хочет вставить элемент во второй индекс, а второй поток - в третий индекс. В этом случае потоки могут помешать друг другу и элементы сместятся не правильно.