The thing cargo syncs is just a git repo containing an index, so the initial fetch might take some time, but subsequent updates are incremental and should be fast. It's not actually the 'entire registry' (which is huge), but an index of the registry. Cargo uses git for this because it's simple and obviously correct.
The index contains the dependency metadata to construct the entire crate dag without downloading the crates themselves. It's not obvious how to achieve the same thing by only downloading part of the registry index.
The cargo source actually contains a lengthy rationale.
One thing cargo could do is a shallow clone. That would probably eliminate all reason to complain about the performance of syncing the index. Cargo doesn't do that because libgit2 doesn't support it.