Google's SEO policy is to build websites for humans and not for bots. At the same time, we all know that Googlebot just likes some things more than others. There's a strong argument to be made that you should just develop the website in such a way that is most beneficial to users and then structure the canonical tag for Googlebot aftewards.
Google has been known to reward larger sites than smaller sites. So creating many pages with canonical tags might give you a boost in this way.
But creating pages with a lot of similar content can dilute Googlebot's crawling usage. And because Googlebot is part AI at this point, it seems to me from my experience that if you don't offer the bot any new and original content that it can get bored of your site and start using its crawler on other domains. Googlebot only has so much crawling server capacity and wants to use it as wisely as it can.
Say for instance you have a big site with 100,000 pages and 80% of them have similar content. Google might crawl 20,000 of these pages and decide that they're too much alike to crawl the next 80,000. This is a real possibility.
If you're using the rel=canonical tag then these pages won't get indexed by Google anyway. As a result, you may really want to just put as much bang for your buck content on each individual page.
Pages that have over 1500 words are known to rank higher than pages with under 300 words. If you're diluting your content across multiple pages then this might reduce your SERP position.
If on the other hand you have a page about "cats" and a page about "cat toys" and you're using some of the content on the "cats" page on your "cat toys" page while still adding addition content to the "cat toys" page, I would just try to have Google index both of the pages. You don't want someone who is searching for "cats" to visit your "cat toy" page over your "cats" page. And you don't want someone searching for "cat toys" to be sent to your "cats" page. You want Google to index both.