Some of us are old enough to have developed firmware with 8080/8085 before BIOS was invented. When BOIS came along, it provided requirements for what to initialize in hardware. The lack of structure within BIOS code was perceived as a plus. We weren’t told how to develop a BIOS and, of course, we were developing in assembly language which abhors structure.
As hardware became more complex and the number of add-in cards grew, the BIOS became unmanageable. So UEFI (Universal Extensible Firmware Interface) came to the rescue. It provided for C development and structure. For a UEFI compliance badge, you had to conform to the UEFI requirements, and everyone was keen to get with the program. While UEFI was gaining traction, processor and chipset complexity was exploding, and firmware was also because it had to keep up with the growing hardware requirements of multi-core, multi-processor, etc. The debug effort to keep up with multi-core and multi-threaded software has grown at an exponential rate.