How are you measuring efficiency? Which one will be faster? Which one will consume fewer resources on the target? on the source? How many rows and what kind of data types are the columns in these rows? Are you sure you can execute a TVF through a linked server (is the target SQL 2008 or later?)? How are you ensuring a 1:1 migration of this data if you're pulling from a TVF?
With those questions out of the way ...
It sounds like you're looking for ETL (Extract-Transform-Load). I'd recommend SSIS (SQL Server Integration Services) with which you can pull the data from the source, apply the transformations that you need, and then load those into your target. This sounds like it'd be a pretty straightforward package (depending on the transformations).
Conventional wisdom states that the linked server approach will go out to the link, pull the data to the local server, and then apply any logic (filters, joins, etc.) on the local server. There is some overhead to fetch the data on the linked server, but the majority of the processing will be handled locally.
The OPENQUERY method will put the processing on the remote server and the "filtered results" will be received by the local server.
It seems like even if you could execute a TVF through a linked server, you'd be getting the worst of both worlds, processing remotely and processing locally (assuming you had additional logic to apply upon the set).
Depending on how you decide to move forward, I'd also look into
OPENQUERY as a means to bulk import/export data.
Having said all of that ...
If both the source and the target at SQL Server (and the target is not a lower version), why not do a backup and restore of the data? This would be a true data migration. Here's some code for you.
BACKUP DATABASE <DatabaseName, sysname, DatabaseName>
TO DISK=N'<backup_location, varchar, BackupLocation>.bak'
WITH INIT, FORMAT, COMPRESSION, COPY_ONLY
RESTORE DATABASE <NewDatabaseName, sysname, NewDatabaseName>
FROM DISK = N'<backup_location, varchar, BackupLocation>\
<DatabaseName, sysname, DatabaseName>.bak'
MOVE '<DataFileName, sysname, DataFileName>' TO '<DataMDFPath, nvarchar(600), DataMDFPath>',
MOVE '<LogFilePath, sysname, LogFilePath>' TO '<LogLDFPath, nvarchar(600), LogLDFPath>',
You can refer to this answer on how to use templates in SSMS.