For example, "Press 1 for X, 2 for Y, or dial an extension." Let's assume extensions start with 3.
If I accept three digits with a timeout, I won't get an instant response to 1 or 2. If I have 3 call another script that accepts the rest of the digits, the digits get lost if dialed too quickly (they're not buffered).
Twilio developer evangelist here.
This is not possible without using the timeout as you already explained.
I'd recommend that you build it such that when the user dials 3 your initial action then returns a new <Gather>
that expects the number of digits of an extension.