I see this question as two parts: information architecture and templating.
If you're used to something like WordPress where the template has a one-to-one relationship with how the template gets data and how information is routed, ignore everything you've learned.
Let's get the requirement of reusing templates out of the way first. Twig, Craft's templating language, lets your reuse templates quite easily.
Not only can you use reuse templates from any page inside Craft, you can also extend templates from other templates.
Craft then lets you define which template is going to be used for each section. You could just set it to a single one and be done with it if your content doesn't change that much from section to section. A single Matrix field could pull off quite a bit across the entire site. Speaking of...
Matrix fields can be used for "site builder" like functionality. Matrix lets you define block types (eg Pullquote, Featured Image with Caption, etc) and then by mixing and matching the blocks, you can "build up" a page. The blocks can also be reordered. That gives authors a lot of flexibility in how they layout the pages.
Entry types define what content Sections contain but unless you define the same Entry Types across multiple Sections, they're not "global" like Matrix fields would be.
Entry Types are useful if you need to define content (and layout) requirements for entries in the same section. If you curate a blog for example, you might have a "Link" Entry Type that links to other entries or even other blogs. Then you might have a "Blog Article" Entry Type for "regular" content.
In your templates, you have the ability to check which Entry Type the entry happens to be and have your template format it how it should look. The Happy Lager does this inside the News section.
In my experience, there aren't any hard and fast rules for using Matrix and Entry types, it really depends on your content and requirements. You could probably pull off what you're asking for with either.
If your templates are "designed", meaning the products are always going to live in a certain spot inside a template, then you can probably use a relational field to define the relationship.
If you want your authors to be able to define multiple elements on a page and then pull in the products from anywhere, Matrix is going to be your weapon of choice
Mijingo just introduced a course you might find useful on the subject as well.