Option 3 is the clear winner, because neither option 1 nor option 2 have a clear way of indicating which organization they're the primary contact of. As soon as someone is affiliated with two organizations, that means trouble.
The unfortunate part of this is that you can't assign a profile via a relationship. You can do so via Webform-CiviCRM, or via ...
It is little difficult to provide sql for contact export as it is has many tables joins. The basic query to fetch all primary details is pasted below. The output may not be same as what you get in exported file because some of the options are converted from value to label using php and also the query is not joined with the custom data table as the table name ...
The 10 years old solution seems to be the best one, have you tried and would it be possible to remove the view all contacts permission to your users that should only use the reports?
Otherwise, it shouldn't be too complicated to alter the UI and remove the send email actions on a custom extension, but that would require some coding
In case you only want to allow one primary contact at maximum you can go for a contact reference field within the organisation. The drawback would be, that you will not be able the view that information coming from the side of the employee.
We created a new Contact Type based on the Individual called Main Contact. The person icon is a slightly different color, so you can tell on a glance who is and who isn't a Main contact. We also have customized some reports to pull only that type.
Another thing we've done (but may not work in your case) is that the Main Contact is typically the only person ...
Maybe, the easiest way is, to open the csv in Excel (or LibreCalc) and do some magic with formulas?
Or even much easier: Open the file in Excel (or LibreCalc) and do some search and replace in the column?
That's the way I would do it, if the file isn't to big for Excel and it isn't a work I had to do every day.