Você tem que assumir que essa captura não pode acontecer "na NIC".
Não há interface comum para cada NIC; é por isso que todo sistema operacional precisa usar drivers de dispositivo para abstrair a interface. Você especifica apenas a interface de rede (por exemplo, eth0) que deseja usar com o Wireshark. Você não especifica o fabricante / modelo do hardware ou o nome do driver de dispositivo.
Então, por lógica simples, uma de suas alternativas tem que estar errada.
Eu li sobre um método para receber os quadros Ethernet brutos antes que eles sejam processados pela pilha de protocolos. Mas o método apropriado para responder a sua pergunta é realmente examinar o código fonte da GPL.
If the capture happens at the kernel, I can't explain why the latency is different when using different NICs as they are all using the (same) kernel network stack.
(Você não está claro em relação ao que "latência" está calculando / medindo e como isso varia.)
Aparentemente, você não considerou que o método que o Wireshark usa para capturar quadros pode ser completamente separado do método que marca os quadros de data e hora.
O Linux suporta registros de data e hora gerados por hardware e software de quadros Ethernet.
Os carimbos de data / hora do hardware seriam gerados pelo adaptador de rede.
Os registros de data e hora do software seriam gerados pelo driver de dispositivo do Linux.
Detalhes são descritos em Documentation / networking / timestamping.txt
Resultado final
Wireshark é um aplicativo do espaço do usuário.
Ele só pode utilizar os recursos que o sistema operacional oferece por meio de APIs.
Como o registro de data e hora dos quadros é intrínseco ao subsistema de rede, o Wireshark não é obrigado a executar seu próprio registro de data e hora, mas sim utilizar os recursos existentes do sistema operacional.
Consequentemente, o Wireshark pode "capturar" pacotes de rede brutos (com registros de data e hora) usando chamadas de sistema existentes.