A versão assíncrona sempre será mais lenta que a versão síncrona quando não houver simultaneidade. Ele está fazendo o mesmo trabalho que a versão não assíncrona, mas com uma pequena quantidade de sobrecarga adicionada para gerenciar a assincronia.
A assincronia é vantajosa, no que diz respeito ao desempenho, por permitir maior disponibilidade. Cada solicitação individual será mais lenta, mas se você fizer 1.000 solicitações ao mesmo tempo, a implementação assíncrona poderá lidar com todas elas mais rapidamente (pelo menos em determinadas circunstâncias).
Isso acontece porque a solução assíncrona permite que o encadeamento que foi alocado para manipular a solicitação volte ao pool e trate outras solicitações, enquanto a solução síncrona força o encadeamento a ficar lá e não fazer nada enquanto aguarda a conclusão da operação assíncrona. Há sobrecarga na estruturação do programa de uma maneira que permite que o thread seja liberado para fazer outro trabalho, mas a vantagem é a capacidade desse thread de fazer outro trabalho. No seu programa não há outro trabalho para o thread fazer, então acaba sendo uma perda líquida.