is this correct?
Yes, the observation about leading and trailing zeroes corresponding to endianness looks correct to me.
So does getblockheader (verbose = false) return little-endian hex:
I think it returns the header in Bitcoin’s network serialization, which has most integer values in little-endian byte-order. This conflicts with Internet standards but that’s the way Satoshi Nakamoto wanted it.
and getblockhash […] return big-endian hex,
Yes. I believe Satoshi Nakamoto and other developers preferred to present individual integers in big-endian as that makes most sense to conventionally educated people where fifteen is written as 15 not 51 because ten is bigger than five.
Why isn’t everything the same endianness?
I doubt anyone really knows Satoshi Nakamoto’s intent here. He was aware of endianness problems in porting Bitcoin code between architectures (and I think discouraged use of PPC for this reason).
I suspect some of this springs from characteristics of C and C++ programming and habits widespread in that community. These issues might not arise in network applications written in other programming languages and written to conform to Internet RFC standards.
RFC1700 by Reynolds and Postel in 1994 says
When a multi-octet quantity is transmitted the most significant octet is transmitted first.
Bitcoin violates that rule.
The consequence is that, in Bitcoin, I find you have to pay special attention to endianness and carefully code around it. I also find that many people are tripped up by this.