The best approach here would be to avoid having different subscriber keys directly at source. What you need to do to avoid this, is to have your Cloud Page create a contact in Sales Cloud instead of creating it in a Data Extension. This will ensure you only use Contact ID as Subscriber Key, and avoid duplicates. Additional benefit would be having a complete overview of all your records in Sales Cloud. Currently, there will be individuals who are created in Marketing Cloud, and not known in Sales Cloud.
I will suggest following approach, based on a submission of a custom form on your Cloud Page:
VAR @Email, @ContactID, @FirdstName, @LastName
SET @LookUp = RetrieveSalesforceObjects('Contact', 'Id, FirstName, LastName', 'Email', '=', @Email)
IF RowCount(@LookUp) > 0 then
SET @CRMRow = Row(@LookUp,1)
SET @ContactID = Field(@CRMRow, 'Id')
SET @ContactID = CreateSalesforceObject('Contact', 3, 'FirstName', @FirstName, 'LastName', @LastName, 'Email', @Email)
Above code will also ensure you don't create a new record if a record with same email address already exists. You must of course ensure to pass the form values to ampscript variables appropriately.
You can choose to use single send journey in Journey Builder to send the email, upon creation of a new Contact record, ensuring you will still be able to communicate in near real time with the person submitting the form, however you will need to pass an additional "flag" to a custom field on the contact, which will distinguish creation/update of a contact eligible for that given email, from other contacts created/updated.
Alternatively, you can use AmpScript to send a triggered email, by adjusting this example made by Zuzannamj (source). You should pass @email and @contactid parameters from the lookup/create code above:
VAR @ts, @tsDef, @ts_extkey, @ts_email, @ts_sub, @ts_statusCode, @ts_statusMsg, @errorCode
SET @ts = CreateObject("TriggeredSend")
SET @tsDef = CreateObject("TriggeredSendDefinition")
SET @ts_extkey = "ExternalKey"
SET @ts_email = @Email
SET @ts_subkey = @ContactID
SetObjectProperty(@tsDef, "CustomerKey", @ts_extkey)
SetObjectProperty(@ts, "TriggeredSendDefinition", @tsDef)
SET @ts_sub = CreateObject("Subscriber")
SetObjectProperty(@ts_sub, "EmailAddress", @ts_email)
SetObjectProperty(@ts_sub, "SubscriberKey", @ts_subkey)
AddObjectArrayItem(@ts, "Subscribers", @ts_sub)
SET @ts_statusCode = InvokeCreate(@ts, @ts_statusMsg, @errorCode)
IF @ts_statusCode != "OK" THEN
RaiseError(@ts_statusMsg, 0, @ts_statusCode, @errorCode)