Just a quick update. Normally, MacOS dot-revs make incremental changes. However, between 11.2 and 11.3, Apple made substantial changes to the startup code. In particular, a sequence of events that's been present since Sierra (kernel_bootstrap_thread() » bsd_early_init() » sysctl_early_init()) is completely gone, replaced with code that's doing something different. (The 11.2 code includes sysctl_load_devicetree_entries(), which lays the groundwork for parsing the device tree; the 11.3 code doesn't call that function, and doesn't even seem to look at those IOReg variables.) This immediately precedes PE_init_iokit(), which not only initializes IOKit, but also the C++ runtime environment that the higher-level stuff relies upon; it also launches the IOKit matching process, which is how the boot device gets discovered. As you might imagine, changing the startup code around IOKit also changes the timing. While it's still possible that the underlying issue is hardware-related (e.g. some neglected code for dealing with the Ethernet ports or SMC or other 5,1-specific device, which doesn't affect newer (or older?) machines, but sometimes hobbles the 4,1/5,1), I'm beginning to think it's all about these changes to the bootstrap process. And since there's new code in play here, that's where my focus goes next (because that's the most likely source of problems) - however, it remains a possibility that there's always been a race condition in place, but the conditions never really allowed for a failure until these new changes exposed it. (The kernel source has many comments like "This is racy because we don't get the lock!!!!" and "This is racy; it's possible to lose both" and a number of "This is racy, but..." excuses. It's possible that one of these "racy" conditions has reared its ugly head.)
There is definitely a race condition in play, but catching it "in the act" is proving rather difficult. I'm continuing to chase it, and I'll post updates when I have something useful to offer. Otherwise, I'm not on here very much, so my apologies if anyone has asked me something and I haven't answered. I'll eventually get caught up, once this is resolved (or I surrender and wait for the 11.3 source code release, which would be very helpful at this point).