I'd suggest to follow the code from the CreateSelectDQImpl method in the SQL Server DynamicQueryEngine class. E.g. the code where the fields are added to the select list (AppendResultsetFieldsToQuery) will show you how aliases are determined based on the target. We have one mechanism where it looks a bit obscure, which is in DetermineObjectAliasToUseForSelectListField, where a RelationCollection can contain an alias which is used for the projection. This is a mechanism we had to introduce to overcome alias issues without breaking code. But the code is fairly straight forward.
We use an alias -> real alias system which is used in the DbSpecificCreator.FindRealAlias, and is filled by the RelationCollection (as otherwise we don't need aliases). It might be the easiest to use that system in your extra code as well.
That aside, I'd still measure the hit in performance compared to the overall query performance when using long names; it might be it's perhaps slower but not relevant compared to the rest (as the tables have 100+ fields, they're not the fastest either), so if it e.g. is 5% slower due to the long names I'd not go through with this.
Aliasing elements is a complex topic so I'd avoid tampering with it if you can help it.