Ok, so this is one of those fairly rare occasions where Camunda removed a userful feature that was in the Activiti engine.
In Activiti, it is possible (inside the BPMN) to define if a signal will be thrown globally (the default) or only to the current process instance. While this may not be in line with the BPMN specification, it was extremely useful for scenarios such as yours.
Unfortunately, you can't do this in Camunda.
Now, if you don't mind writing a little Groovy script in a task listener, you can limit the signal subscription to only those signals thrown by the current process:
RuntimeService.signalEventReceived(String signalName, String executionId);
Refer to the Camunda docs for more details.
If this is still out of the question, then I would suggest you would wrap the User and Service task in an embedded sub process and throw an exception event immediately after the Service task.
Now, attach an Error Boundary event handler on the embedded sub process.
Something like this (the diagram is from the docs), but without the OR gateway.
When your service task completes, it will throw an error event which will bubble up to the boundary listener and close all tasks in the embedded sub process.
Hope this helps.