there are no catastrophic problems of small gradients with any of these approaches per se, but they fail if you push pre-activation values too far (due to big LR, gradient explosions/spikes etc.), usually early in the training. you can try to “bandaid fix” this issue with something like x.clamp(-5,5).sigmoid() * scale.
I also realized that batchnorm is only appropriate for internal layers, and there is normally no reasons to restrict ranges there.