100s of draw calls vs 100s of updates.

I have city labels pinned on a top down strategy map that the player can pan around. I wrote a small if() statement that checks if a city label is in the camera frustum and sets Canvas Group alpha to 0 if it’s out of view. This saves about 500 draw calls on average but then I realized, I’m adding about 300 Update() checks (once for each label).

I realize draw calls are the heavier thing but by how much? Is it CPU vs GPU performance? Should I try to do more draw call reductions like this?

This is very case specific. Just design your own benchmark for it.
Culling is present in every 3D engine, to prevent objects out of screen from being submitted to the GPU. Perhaps you could optimize by applying some DOTS approach instead of 300 updates