Ah, I understand now.
yes, of course, you need a JOIN ; and you think that all these necessary joins will affect performances, and increase complexity in supporting.
But in your example, what happens when data is modified in natural key 'CompanyCode' of parent table 'Companies'. You need to update all child records in table 'Employees', and you probably have coded a trigger on that purpose, or even better, an constraint with on update cascade (trigger is procedural, and slower than declarative constraint).
With a surrogate key, you will never update child tables, but only one record in parent table . Keep in mind that writing on a physical disk (what you need with an update) is always slower than reading from memory (and your view will be in a cache plan in memory, if you have good indexes)
And the more you have foreign keys in the child table, the more performances are increased with surrogate keys.
Additional maintenance effort in preparing views? not sure. IMHO, less effort in development (both on server side and client side) and in maintenance.
as an example, let's say tomorrow you need to get company name with employee (new requirement of your main customer ). You will need a view, ok? So, why not having this view today, and simply add a field from 'companies' table in it. Views bring you scalability.