There are meaningful ways in which software interacts with the physical world.
Latency is the first to come to mind. The realities of how systems are designed and how permanent the storage in question is translate to latency and thus frequently performance bottlenecks.
Data durability is another thing to consider. Though frequently that's mostly abstracted away in the lower layers of hardware, system composition, and operating system / file system / libraries generally.
Limitations also exist in raw hardware performance (state machine speed, how parallel the computation can be, how parallel the desired process can be made) and capacity, for processing, temporary memory (RAM), and long term storage. Thermal considerations might also be a factor, but those are usually managed by lower layers and present as capacity limitations to typical software.
Software as a domain for achieving goals does offer an unusually wide degree of flexibility in approach. Today we also stand on the shoulders of many giants, with relatively easy access to extremely powerful systems that can obscure many sins for 'reasonable' workloads.