I did exactly this recently. Four identical machines, four identical HMI's one processor.
The way I solved the problem was to use a UDT for each machine's HMI controls, so that all my displays used e.g. {#1}.StartButton, and for parameter 1 I pass in the string "Machine1" (or whatever the UDT for that particular machine is called).
For some things I also used aliases - e.g. if I had a motor associated with machine 1 that had to be named M1234 for site standards, I'd do all the code with M1234, but then set up an alias to M1234 called Machine1_InfeedConv or something, and then again the HMI can just look at {#1}_InfeedConv.
To determine which machine each HMI was on, I set up a HMI tag called "MachineNo". Make sure the tag is set up to be retentive. At startup, if the value of that tag is zero, my main screen is completely invisible, and the only thing on the screen is a "please enter machine number" with a suitable warning about the consequences of getting it wrong, and directing you to an engineer if you weren't sure what to do. Once that number is entered, it sets that HMI tag to the machine number. Once that tag is non-zero, a main menu appears, allowing you to select which screen you want to go to. The trick is, each button on that main menu is actually four buttons, stacked one on top of the other, but only one at a time is visible, depending on the value of that HMI tag. So, if I entered "3", only the navigation buttons for machine 3 are active.
Those buttons call whichever display I want and pass in a single parameter - the tag prefix for that machine (i.e. Machine3). So now, all my other displays are generic, and I just tell it which tag prefix to use when I call them.
There were a couple of hoops to jump through. One was that if you need to pass the machine prefix through to a second display, you have to use parameter lists (specify the parameters directly at the button that calls the display), rather than using parameter files. So, if you navigate to the main mimic with #1 being "Machine3", and then want to call a popup for Machine3_Agitator, you can do it - you just can't do it if you're using parameter files.
Also alarms. The best solution I found for this was on the alarms page to again have four alarm display objects, visibility controlled to show only the one relevant to your machine. All the HMI's have the alarms for all machines, but each alarm uses the labels to filter, so you can have an alarm display that shows only Machine1 alarms, and is only visible when that HMI tag is equal to 1.
Anyway long story short, yes, it can be done, I've done it and it worked really well. And I've sure been grateful each time they've asked for a small addition to the HMI that I only have to make it once and download it four times!