"Nice software" with different versions for FPU type / processor type were seen as using less memory and system resources back then.
Yeah, having a single binary with:
if (68000)
{
}
else if (68020)
{
}
All over the place would be horribly inefficient for memory and cpu usage.
The ideal would be a compiler that can target multiple cpus in one pass and output different hunks that only get loaded if that cpu was available.
So a binary built for 020/030/040/060, may have some routines that have the same code built for the 020 & 030, and separate code built for the 040 & 060. And others might have code shared for the 020/030/040 and separate for the 060. When loading it would make sure that the correct code was loaded and linked & in this case the binary would fail to load on a 68000 and 010.
Actually, the Os is. There is only one dependency I recall where one particular Os function (somewhere in graphics, if I recall) requires a 68020 or up, and this is a conditional assembly which is only used for Kickstarts for machines that came with a 68020 or up. So it's really not that bad. It just means that you cannot plug in a 68K into a machine that was designed to run with a 68020 or up.
Or Kickstart from an 020+ machine in an A500. I'd be interested in where it was. When the A1200 came out, I saved a copy of kickstart from a friends computer and loaded it into the phase 5 68000 14mhz kickstart ram. I probably didn't use it that much, but I don't remember having any problems with the CPU. There were some issues running with ECS, but I think a later SetPatch sorted those.