Yes, you are correct that both approaches should yield the same results.
Using hooks could be easier in case you want to reuse a predefined model and don’t want to override the forward method (e.g torchvision.models.resnet50()), but this also depends on your personal coding style. E.g. I would prefer to override the forward method in case I really want to manipulate the forward pass and not only use the hooks for debugging or a quick testing.
Additionally, I think hooks are not supported in scripted models (feature request tracked here) so in case you would like to script the model in the future, I would also override the forward method.