IAM policies are better for central management, to reuse policies across multiple buckets or when policy affects different AWS services.
The advantage of bucket policies is that they can grant cross account access without having to create and assume roles and they are useful in case we reach size limit in IAM policy.
If you need Cross-account Console Access you will need IAM Roles
IAM Policies, Bucket Policies and ACLs are NOT mutually exclusive and they can co-exist, but it is worth to keep in mind the precedence:
Policies and ACL are evaluated all-together and applied following the Principle of least privilege:
we start with an implicit deny, and we allow only when there is an explicit Allow, but in case of an explicit Deny, that will overrule the explicit allow.