...as I don't see any special treatment for STDOUT in the perlio.c scrap
Just to be clear: the perlio.c snippet was only meant to show where the PerlIOValid() check happens for the read.
The decision between using a direct close vs. the indirect dup2, OTOH, is more likely to happen in Perl's open implementation (which I didn't yet have time to wade through — it's rather lengthy... and for a low-depth explanation I figured the manifestation of the difference in the strace should be sufficient evidence).