I'm observing some unusual fluctuations in benchmark times for both $powmod and the original scripted bf_modpow alias, with their timing changes not happening together.
When you showed your benchmark time for bf_modpow as 7.4sec compared to the 4.3sec I was getting in 1275, I assumed that since my bf_modpow time was close to half your benchmark time, that my $powmod time would be close to half your 2.9sec time for the compiled C.
But then the 1743 beta containing $powmod came out, and my $powmod time was close to your compiled C time, and only then did I notice that 1603 beta had increased to give me times for bf_modpow closer to yours.
The table below shows my ticks count for the above //command in the 1st column, and the other columns either use 2*2048 or replace $bf_modpow with $powmod, or both.
In 2385 my bf_modpow times went back to the time it had in 1275, while 3337 has $powmod's time increased to nearly match the scripted alias's time. For the 4096 level that Libera recommends for certs, that 'challenge script' would do 2 of these 2048's, so this portion of the script time would now be 8sec.
2048 4096
bf_modpow powmod bf_modpow powmod
1275 4350 n/a 32400 n/a
1603 7000 n/a 53000 n/a
1743 7000 2760 52900 21570
2385 4370 2770 32500 21600
3337 4300 4090 32400 31800