Hardware is not supposed to suddenly change-- it's suppose to retain backward compatibility like for example 8253 is still in modern PCs although they added other means for timing things. It's more efficient to do ASM instructions that directly read/write I/O ports than go through API calls.
let me come at this from a different perspective.
how many chipsets are there currently?
vid cards?
sound cards?
lan cards?
each brand has their own way of addressing the hardware. there is no one generic hw codeset to directly address all brands of control chips. there is always some functions that will be manufacturer dependant.
now would you really want to program for each one individually or program for 1 api built into the os that does the translating for you?
now to compound this each generation of each manufacturer the direct means of addressing the chipset will change. are you willing to rewrite your program with each new piece of hardware release or would you rather program to a non-changing api that the manufacturer creates interface drivers for.
you see the original amiga and aga amiga had the advantage of being the same hardware regardless of machine so people were able to get away with banging the hardware while programming. this also stiffled what commodore could have done with their chipsets since they had to maintain hardware backwards compatibility. this is why commodore was trying to move people away from doing that.