VACUUM may run at a lower intensity than manual vacuum, so it pauses longer between each batch.
autovacuum_vacuum_cost_delay may be set differently to
vacuum_cost_delay; by default there is no delay on manual vacuum, only on autovacuum.
Autovacuum also works harder to avoid blocking concurrent queries and will abort its work if another query tries to take a lock that would conflict with vacuum. Depending on the vacuum phase this may not actually slow it down much, or it might throw away substantial work. The first phase heap sweep marking dead tuples and setting the visibility map doesn't care much if it's aborted part-way, though it might cause a subsequent vacuum to repeat some of the reads. It's much more expensive when we're updating indexes, but that's done in batches to reduce the amount of work lost if a vacuum is canceled.
See autovacuum configuration for the relevant parameters, most notably
autovacuum_vacuum_cost_delay. Note that this differs from the
vacuum_cost_delay setting used by manual vacuum.