What copyTo actually returns
The Sheet.copyTo(spreadsheet) method appends the sheet as a new tab in the target file and returns the new Sheet object. That return value is the whole game. Most scripts ignore it, which is why they end up with a tab called 'Copy of Monthly Report' that nobody asked for.
Capturing the return value and calling setName on it in the same execution is the correct pattern. You're not doing a second lookup — the object is already in memory, no extra API call needed. The first time I missed this, I wrote a separate getSheetByName('Copy of ...') call that broke the moment someone ran the script twice.