Identity Columns or UDF that explicitly generates a unique id?
Your colleague is an idiot.
The solution won't be scalable, the UDF isn't concurrent (same reason as this). And how do you deal with multi-row inserts: this would require a UDF call per row
And migrating to other RDBMS doesn't happen often in real life... you may as well not use SQL Server now and use sequences on Oracle and hope you don't migrate away.
Edit:
Your update states that moving data is for refreshing non-production databases.
In that case, you ignore the identity columns when refreshing. You don't compromise your implementation to make non-prod loading easier. Or use temp tables to track the identity value changes.
Or use processes: we refresh our test system every night from production which avoids the issue entirely. (And ensures our prod backup can be restored too)
Use an identity value. Generating your own sequence table and sequence values will take a lot of overhead and cause a lot of locking and blocking while trying to generate numbers.
Identity exists for a reason, use it.
When SQL Denali comes out it will support sequences which will be more efficient than identity, but you can't create something more efficient yourself.
As for moving records from one environment to another either turn IDENTITY_INSERT ON when doing the insert, or check the box in SSIS.
The identity column sounds fine to me. I'm not sure I follow the logic about why it's difficult to move data between servers.
If you do want each row to have a globally unique identity you can use a UUID but I wouldn't do it unless you are sure that the global uniqueness is necessary - usually it's not. Using UUIDs as ids will decrease performance, increase disk space requirements and make debugging harder - because of the length it is difficult to remember a UUID, tell it to someone over the phone, or write it down on paper without error.