ИМХО.
Регулярка - это не магическая кнопка, которая по нажатию выдает результат. Регулярные выражения - это правила для множественных операций в отношении данных. И чем регулярка более комплексна и насыщена, тем больше будет итераций обработки входных данных.
Пример:
ОЧЕНЬ НЕ ОПТИМАЛЬНЫЙ - просто как концепция
www.site.ru/catalog/subcatalog/file.html?key=value&key2=value2
Если использовать explode, то сперва разбиваем по / - получаем
- www.site.ru
- catalog
- subcatalog
- file.html?key=value&key2=value2
Далее для "последнего" элемента применяем еще один explode по ?
- www.site.ru
- catalog
- subcatalog
- file.html
- key=value&key2=value2
Далее для "последнего" элемента применяем еще один explode по & - что бы обработать возможное множество переданных GET-параметров
- www.site.ru
- catalog
- subcatalog
И теперь для всего множества GET-параметров, explode по =
- www.site.ru
- catalog
- subcatalog
И на весь этот ужас мы потратим: 3 explode + (explode * на кол-во GET-параметров) и при этом можем вложить проверки на необходимость выполнения следующих шагов не только по содержимому данных, но и по вхождению в "базе роутов" = если мы понимаем что catalog не существует => зачем пытаться разбирать дальше, если и так уже ни чего не найдем и можно сразу бросать Exception для перехода на 404.
А вот итерационные операции регулярного выражения могут (с большей вероятностью) иметь больше операций.
Вывод:
Чем сложнее регулярка тем "дороже" ее исполнение.
И как вы верно сделали утверждение, роутер это основа которая должна работать быстро. А вы можете потратить много CPU ресурсов на разбор регуляркой - что бы потом выяснить что искомого роута просто нет.