There might be an easier way than how I generally do this sort of thing, but it works.
I initially concatenate (concat) each of the emails and add a semi-colon between each one, then enclose this into a split expression on semi-colon. This gives me an array of emails (both filled in and blank).
The expression for this example might look like this:
split(concat(item()?['Email 1'], ';', item()?['Email 2'], ';', item()?['Email 3']), ';')


I then filter our any empty items in the array using a Filter Array resulting in the following.


Finally, I use another Compose to get me a list of email addresses separated by a semi-colon.
The expression for this example might look like this:
join(body('Filter_array'), ';')


See full example flow below that sends an email to all the emails listed in each row.
