Почему же?
Если есть два сервера
server_name *.domain.ru
и
server_name old.domain.ru
описанных именно в этом порядке
и запрос приходит на old.domain.ru - в каком сервере логично этот
запрос отработать?
Не надо выдёргивать фразы из контекста. Если есть такие server_name и
запрос приедет на адрес, явно прописанный в listen для *.domain.ru c
Host: old.domain.ru, nginx отправит его в первый server, не глядя на
server_name вообще, если old.domain.ru висит на *:80. То есть, выбор
хоста по адресу (по логике сокетов) сейчас имеет приоритет над выбором
хоста по имени.
И это логично, ибо сначала происходит tcp соединение, а уже потом -
отсылка Host и т.д. и т.п. Просто Вы почему-то считаете, что
listen+server_name - это неразрывная пара для определения name-based
виртуального сервера (терминами апача). Но это не так - listen отдельно
и отвечает за установку tcp соединения (вооще не только http есть в
nginx), а уже потом по _выбранному_ сокету приходят Host и выбор сервера
по нему. Гляда на такую последовательность действий - все тоже
становится очень логично. Логика, она вообще такая штука - зависит с
какой стороны посмотреть.