The way we're doing it, it only generates a delete+add if the file on the branch doesn't a have common ancestry with the file on trunk.
The reason we 'deliver' our changes to trunk this way is because we keep our branches up to date from trunk using the normal way you're describing:
With this method, people can work on updates for a while, keeping up-to-date with trunk, but not deliver their changes to trunk until they're done. The problem is that all the changes made to the branch since creation would include all the merged-in changes from trunk, so we do the delivery by comparing HEADs in trunk and the branch.
svn merge -r LAST_UPDATE:HEAD TRUNK_URL BRANCH_URL
The main problem/question I have, however, is where do the files come from that are compared for a merge? If I specify two working copies to compare, does it use the files of those WCs? Or does it just do an 'svn info' to get the url from those WCs, then gets all the files from the server.