All blockchains systems perform two fundamental functions: 1) validate transactions and 2) store them so the network stays available for later use. This fairly trivial characterization provides a simple ways to think blockchains. In essence every blockchain systems provides two guarantees: data availability and execution validity.
Data availability is about storing and retrieving blockchain data. Having guarantees over blockchain data means that the system is resilient to both nodes going offline and malicious nodes withholding data. Some systems have all nodes storing all data eg. Bitcoin and Ethereum while other do not eg. Filecoin and Arweave.
The bottleneck for data availability is storage costs since blockchains are normally storing data forever and network bandwidth available to nodes to propagate data around the network (either new transactions or data availability proofs).
Execution or compute bottlenecks are about processing transactions to make sure that the blockchain is valid. Having guarantees over execution means that the system is resilient to processing invalid transactions. Some blockchains have their nodes process all transactions eg. Bitcoin and Ethereum (similarly to data guarantees) while others do not eg. Near and Polkadot.
The bottleneck for execution is, surprisingly, hard drive read speeds and not CPUs. CPUs are not the bottleneck since nodes can't have all smart contract data in RAM and have to load them first in to be able to process new transactions. Many smart contracts have tons of data stores and loading it all takes a significant amount of time.
If all smart contract data could fit into RAM that wouldn't be a problem but blockchains today are far larger than what can fit in RAM (eg. Ethereum is around 870GB). In some hypothetical estimates, TPS could increase by ~100x by some estimates if the hard drive was not the bottleneck but was the CPU instead but right now it seems impossible to get around loading the data from the hard drive.
Every blockchain can be thought as a system that provides two fundamental guarantees. These are data availability and execution validity.
Data availability ensures that blockchain data are stored securely while execution guarantees ensures that transaction are processed correctly.
Different blockchains make different compromises in regard to these two properties to achieve designs with traits such as instant finality, faster transaction confirmations and higher TPS.