Node 18's startup overhead gets people constantly. The runtime itself is heavier, plus your dependencies likely have more initialization code than you realized. Cold start isn't theoretical until it's your oncall getting paged.
Provisioned concurrency is the bandaid though. Real fix is probably code-splitting your handler dependencies and being aggressive about what loads at startup. We cut cold starts from 6s to 1.2s by moving heavy stuff out of the handler closure. Worth measuring where your 8-12s is actually going before throwing reserved capacity at it. Sometimes it's just one library doing expensive I/O on import.