A VCD is the simplest possible record of a simulation: every time any watched signal changes, the value and the timestamp are written out as text. That simplicity is also its cost. A full-chip, full-run VCD reaches tens to hundreds of gigabytes, the simulation itself slows by a large factor while the dump is open, and most of what is captured is never read. The discipline is to dump only the scope and the time window that carry the activity you actually need.
Scope and window are the two controls that matter. Dumping is limited to the blocks of interest — with the hierarchy level and instance passed to $dumpvars — and to a representative interval, opened and closed with $dumpon and $dumpoff around the traffic that represents real operation. A steady-state window a few thousand cycles long usually characterises power far better, and far more cheaply, than a whole regression run captured indiscriminately.
Gate-level activity has one extra requirement: it is only meaningful when the netlist is back-annotated with SDF, so that delays and the glitches they produce are represented. RTL power estimation can work from averaged, statistical activity — which is what SAIF is for — while gate-level power for signoff wants the real value changes, timed, so peak power and vector-specific behaviour are visible. Choosing the averaged path or the vector path is the first decision, because it decides everything downstream.