Picture an API serving 2,000 requests per second, each running one 3 millisecond query. Without pooling, every request pays roughly 30 milliseconds of handshake, so a single connection could serve only about 30 requests per second and you would need to open and tear down 2,000 connections a second, which no database tolerates.
With a pool, you might hold 25 open connections. Each can run 3 millisecond queries back to back, so 25 connections handle far more than 2,000 queries per second, and the handshake happens 25 times total at startup rather than 2,000 times per second. Latency drops from tens of milliseconds to near the raw query time, and the database sees a stable, bounded number of backends.
This is why HikariCP, the default pool in Spring Boot, and node-postgres' Pool, and SQLAlchemy's QueuePool ship pooling on by default. The connection pool is invisible plumbing, but it is the difference between a database that survives production and one that falls over on the first traffic spike.