EE is going to try to figure out what content to serve automatically unless you specify what content to grab. So when you have a URL that has a valid URL title like www.example.com/products/g3-product EE will recognize that the last segment is a valid URL title and show that content. When you have a non-valid url_title like www.example.com/products/generation3-product EE is going to first try to find an entry with the url title of the last segment. If it doesn't it is going to show the first entry that matches your channel entries tag (in most cases this will be the most recent entry).
James Smith wrote a great URL Schematic chart of what and how EE processes URLs so take a look at that to help you get started.
There are a couple of things that you can do.
First you will want to add a few things to your template but without seeing your template now I am going to have to guess. You probably have something like:
{exp:channel:entries channel="products" limit="1"}
{title}
... Other tags here ...
{/exp:channel:entries}
You can add the require_entry
and url_title
fields to have better results.
{exp:channel:entries channel="products" limit="1" require_entry="yes" url_title="{segment_2}"}
{title}
... Other tags here ...
{/exp:channel:entries}
Even better you can add a redirect to the 404 page if the URL title is not valid.
{exp:channel:entries channel="products" limit="1" require_entry="yes" url_title="{segment_2}"}
{if no_results}
{redirect="products/noresultsfound"}
{/if}
{title}
... Other tags here ...
{/exp:channel:entries}
That should prevent EE from showing you the wrong entry. The next step would be to setup some 301 Redirects in either you .htaccess file or using an add-on such as Detour Pro to direct the user from the wrong URL to the correct URL.
.htaccess
Redirect 301 products/generation3-product www.example.com/products/g3-product