You can delete products as long as they don't have stock and are not included in open orders. Their product names are still tracked however so you cannot create new products with the same name nor undelete them for future use.
The deleted products do not count towards your tier limit so you can delete older products to make room for new ones but you need to make sure that the older ones you're deleting will actually not be used again.
If you have product codes that are 'disposable' but somehow recurring you can consider creating a generic product code for them (such as 'container box') which you will not be deleting. That way you can avoid deleting product codes just to make room for new ones - deleting should be reserved for items that you actually discontinue.
Just note that in this approach if you include e.g. 'container box' in a report covering multiple projects or a long duration that product code will correspond to different physical items so you need to be careful to avoid confusion. The best way to ensure that is simply to actually have different product codes for different physical items.