Your CRM reflects your knowledge about each buyer or user of your product at a certain point in time. When the number of entries in the CRM grows beyond a certain limit (somewhere between 10 and 50), you will not be able to affort to keep that information always up-to-date. You won't get automatically informed if a person associated to a CRM quits, changes the company, changes his/her name or working location. You may even miss the information if the company vanishes, rebrands, relocates, merges with another company or splits up into many (though most companies invest some effort to inform their business partners about such actions).
The point of this is: you cannot avoid data duplication in a CRM completly, because data duplication can be an effect caused by unavoidable obsolescence of the data.
If user Alice from company X buys your product today, and Box from company Y buys your product next month, you may not know if X and Y are really different companies, or if X was just rebranded to Y, or X is just a sub-department from Y, or something different.
The question you should ask yourself here: Why is it really important to avoid data duplication?
Note that for the restricted use case of license purchasing, or even contracts, data duplication is not an issue. Your customers identify themselves as a company or individual at the point in time when they buy the license or sign the contract. If you have two buyers from the same company, it does not make difference from the contract's perspective if you store their data once or duplicated. If there are license-related actions to take at a later point in time which involve customer data, and the customer forgot to inform you about changed contact data, it is usually not a real issue to use the old contact information to find out about the new one.
Duplicate data will only become a problem when you, for example, have dozens of contacts from the same company in your CRM to manage, and then you need to apply changes to the company data "as a whole" - rebranding, relocation etc., what I mentioned above. Avoidance of data duplication will help to make the management of this data more convenient to some degree, but it seldom needs to be a top-priority goal - it is only a matter of convenience, no less, no more. In reality, you can often live with a certain redundancy. Just make it clear for everyone who works with that CRM that entries in there reflect a historical customer knowledge from the past.
Best you can do here is
give each entry in your CRM database a timestamp which is transparent to the users, so they can see how "up-to-date" the information is
have only trained users enter / update information in the CRM, and make sure they double-check for the existence of a company in the CRM database
whenever your customers send you an update about their personal or business data, make sure your CRM users use that as a occasion for not only updating their data, but also double-check related data. For example, encourage them to make a web search to check the business data
in your CRM software, provide tools for finding already existing data, and for restructuring persons, companies and their relationships. It should be easy, for example, to assign or reassign a company to a person whenever your users get aware the old assignment is not up-to-date any more.
So in short, your users have to learn to live with the fact that some degree of duplication is unavoidable, and that only a certain effort to fight the duplication is worth the hassle.