Sadly `org-refile' isn't a programmatically friendly function. What you want to do is generate a RFLOC parameter value for your desired target and use "Copy" as the MSG value. Here's some code to do it programmatically.
I recommend using org ID's whenever possible to virtually eliminate any ambiguity in reference to headings. First, create an ID for the destination and use that.
(let* ((target-heading "Destination")
(target-marker (org-find-exact-headline-in-buffer target-heading))
(target-id (save-excursion (goto-char target-marker)
;; => "22bdee5f-3c93-4ca7-b944-48db2ddc3538"
Then here is a function to help programmatically refile or copy those headings:
(defun ebpa/refile-matches-to-heading (match target-heading-id &optional scope copy)
"Refile all headings within SCOPE (per `org-map-entries') to TARGET-HEADING-ID."
(if-let (target-marker (org-id-find target-heading-id t))
(let* ((target-rfloc (with-current-buffer (marker-buffer target-marker)
(buffer-file-name (marker-buffer target-marker))
(headings-to-copy (org-map-entries (lambda () (point-marker)) match scope)))
(with-current-buffer (marker-buffer heading-marker)
(org-refile nil nil target-rfloc (when copy "Copy"))))
(message "%s %d headings!"
(if copy "Copied" "Refiled")
(warn "Could not find target heading %S" target-heading-id)))
You can use it in the following way: