Hello David,
Yes, you are right !
Actuallyn there are many situations/use cases, and it is why I greatly appreciate Adobe Campaign, which is both powerful and flexible to manage all these cases...
For example, in some cases I use the triple key (first name, last name, email) to reconciliate (insert/update) records, so it manages quite well registration forms and updating forms that retrieves the right record, in case of an household, where the family shares the same email but the different people give their own last name/first name ; in that case, the 1-n relationship tables insert/update are done with the iRecipientId returned.
In other cases, perhaps the majority I guess, using email as key is enough. Just take care that unicity email is not guaranteed by Adobe Campaign (no unique index on email in factory schema nms:recipient).
Depending on your use case, sending a delivery to an ID means only one message/email, while sending to email can lead to several messages, even if you can let the engine selecting one record among several thanks to the Duplicate addresses exclusion rule of the delivery.
If email is unique for your dataset, there is no problem to submit your delivery directly as well.
Regarding the delivery, you can either use the standard Delivery activity in the workflow with the targetData information (best and easiest way), or use JSAPI submitNotification function (and a continuous delivery most probably) if it is done by your own loop management, either in a workflow or a webApp, such as this code below:

Regards
J-Serge