From https://www.sqlite.org/about.html :
"SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine"
Zero-configuration is actually quite an onerous design requirement, as it immediately eliminates most features which shouldn't be on by default. It also eliminates tuning.
Serverless imposes most of the rest of the performance penalty. If you're accessing a sqlite database from a single process, it will most likely be limited by your storage speed. But if you're writing to it from multiple processes, lock contention will quickly become an issue. The obvious technique to improve lock contention is to separate the tables so they can be locked separately, but then you lose the single-file convenience.
That's why that page also says "Think of SQLite not as a replacement for Oracle but as a replacement for fopen()".