Your ip-helper is the correct way to do this for redundancy and is the recommended method.
The DHCPDiscovery (broadcast) gets picked up by the ip-helper and then unicasts to each DHCP server with the relay-agent (the router) in the request.
Usually the first DHCP server to respond wins. Both DHCP servers can (and should) make DCHPOffers to the client. It's the client that decides which one to keep and then sends a DHCPRequest (unicast) to the server that offered it for the IP it wants to use. The server needs to DHCPAck that request to complete the process.
For redundancy, but to not violate the DHCP rule of not having overlapping scopes defined for your IP pools, you need two ip-helpers. Since the DHCP servers are not aware of one another, the IP pools must be unique. A common method for DHCP redundancy is to take your typical /24 subnet and divide it into two /25s for your scopes (one per server).
Example: 192.0.2.0/24 is your actual network, so you divide it into 192.0.2.0/25 and 192.0.2.128/25. So the roughly 256 addresses are cut into two pools of 128 addresses and assigned to each DHCP scope. Now you have no overlapping addresses + redundancy.
Since cutting your scope pool in half, make sure the servers can support your entire network if one DHCP server were to fail. Consider the lease-time to be the duration that clients can retain their addresses where you won't exhaust your pool if you have many rotating clients, yet be able to give you enough time to detect and fixed a failed DHCP server.