All problems in computer science can be solved by another level of indirection.
A common way to enable problem-oriented, easy to handle programming, is to introduce abstractions, which provide a virtualized view of a system to higher levels in the software stack. For example, an operating system provides a virtual machine via system calls that enables a programmer to work with files instead of having to access the hard disk directly.
However, these abstractions are costly - they require e.g. transitions from user to kernel space (including switching of page tables) or copying and rewriting of data. An interesting recent study  has shown that the latencies for keyboard input, i.e. the time it takes from a keypress to the related character appearing on the screen, has increased significantly over the last four decades, even though computers are many orders of magnitude faster than in the 1970's.
This cost of abstraction can be observed on many levels and is usually considered a more-or-less worthwhile tradeoff to improve other non-functional properties of a system, such as security. For example, microkernel-based operating systems suffered significantly from a large context-switch overhead, since components of the OS that are executing in the kernel address space, such as device drivers, now run in user space and have to perform costly context switches to the microkernel. Liedtke discovered that the performance of inter-process communication (IPC) was crucial to building an efficient microkernel-based system . However, hardware improvements may make some of these assumptions irrelevant, leading to publications that give a different view .
Similar approaches to overcome abstraction costs can be found in other performance-critical applications. In HPC applications, there is a trend to employ user-space networking  (of course, with a critique of this approach ) and storage . For virtualized environments, GPU passthrough has been introduced as a way to provide full GPU performance to a virtualized host . However, the OS still plays a significant role in an area of kernel-bypassing, as demonstrated by .
The hardware-software interface is interesting since abstractions that enable an easier use of the hardware usually cost performance. In this multi-criterial optimization problem, it is important to look at both sides of the problem to find a useful compromise without violating essential requirements, e.g. in security or energy consumption. The increasing use of libraries and frameworks has contributed significantly to the related overheads. In turn, some initiatives were started to again create lean software [9,10]. So far, these have unfortunately been mostly ignored...