There are a lot of peripherals that one has to use including printers, disk drives, com ports, etc., etc.
For example, when you read/write something to the disk, you need to know if space is available on the said device, an appreciation of how the disk has tracks and segments, a lot of low level hardware related things including timing etc. When you read/write from the disk, do not think that the data is read or written on the very first try even though it may look so. How do you buffer the data read or to be written when you have many actions happening at the same time. On the COM port, how do you recover from an error, how many times do you retry before giving up. If you were to handle all these scenarios yourself, you will end up writing close to the DOS system we have. DOS has been around for a few years developed by a major corporation and used and critiqued by the world. Would you want to do it yourself?
What can be done is for special pursposes implement a non used interrupt in the interrupt vector (low memory area) and code you functionality. Even there you may fall back on many DOS provided functions.