In my subjective opinion, the cannibalization issue is somewhat overestimated and not as critically important as it’s often made out to be. However, if it occurs at scale across a website, it can indeed lead to a significant loss of search traffic.
In such cases, I recommend first determining which page is the primary one and which is secondary (less relevant). Then review the content of the secondary page and make sure there is no excessive use of the keyword corresponding to the search query where cannibalization is occurring, especially in H1, H2 headings and the meta title. The content should be adjusted to focus on a more specific, narrow search query so that Google can clearly distinguish the intent of each page. As a final step, place a dfollow link at the top of the secondary page pointing to the primary page, using the main keyword as the anchor text.
If the pages are nearly identical, it makes sense to use a canonical tag to indicate the preferred page. You can also apply a noindex tag to technical or transactional pages that are not intended to rank. However, in most cases, Google handles this quite well on its own without human intervention.