Consider the complexity of supporting all the dozens of CPU instruction sets and a few dozen more built-into-the-CPU hardware peripherals/extensions (e.g. SSE, hardware random number generators, etc). There's probably a thousand different combinations thereof across x86, ARM, MIPS, etc. There's only so many different kinds of hardware out there (and half as much quirky bullshit if you take out all the Sony laptops!)
Now consider how many websites that exist with all kinds broken code, use of dead APIs, old versions of, well, everything. Yet a modern browser can display those sites just fine 99% of the time. Users expect this!
Making a modern browser that works across all those nearly infinite combinations is considerably more difficult than making a kernel boot on a new board with a plethora of datasheets out in the wild to download at your leisure.
Now consider how many websites that exist with all kinds broken code, use of dead APIs, old versions of, well, everything. Yet a modern browser can display those sites just fine 99% of the time. Users expect this!
Making a modern browser that works across all those nearly infinite combinations is considerably more difficult than making a kernel boot on a new board with a plethora of datasheets out in the wild to download at your leisure.