Does adding a postgres index concurrently take up disk space gradually or all at once?
When running CREATE INDEX in PostgreSQL, disk space will be allocated gradually as needed. It should be easy to observe with a simple command like watch du -s $PGDATA.

Same applies to any data-generating command (INSERT, COPY, CREATE TABLE AS, etc etc).

It's hard (and in most cases, pointless) to pre-calculate and pre-allocate all required space before object is created. If the transaction breaks, data can be simply discarded.