Verilog — The proper way to reset an output signal back to zero on the next clock edge?
However, I don't have a clear understanding why it even compiles successfully: the assignment to signal seems ambiguous in the case when signal == 1 and count == 10. What this ambiguity synthesizes into? Can the synthesizer deduce that the case when both signal == 1 and count == 10 are true isn't actually possible?

There is no ambiguity on signal even if that condition gets satisfied (of course it won't happen in this case). For eg., suppose you simply write under @(posedge clk):
if (a) begin    
   b &lt;= 1'b1 ;
   b &lt;= 1'b0 ;
end

The synthesiser will 'ignore' the first statement as the final assignment to b gets 'precedence' on satisfying that condition on a.
Synthesiser therefore synthesises the code equivalent to:
if (a) begin    
   b &lt;= 1'b0 ;
end

This is because in a hardware, a signal can only settle to a single value on any rising edge of the clock. The synthesiser is smart enough to deduce that.

Is writing code like this considered good or bad practice?

Can't generalize it as it depends on the context. But all fine as far as it is synthesisable construct.
For instance, your code snippet was synthesised in (Vivado synthesiser) to a netlist with count == 10 controlling the set to signal register:

Alternatively, you could have achieved the same functionality by:
 if (count != 10) begin
    count  &lt;= count + 1'b1 ;
    signal &lt;= 0            ;
 end

 else begin
    count  &lt;= 0 ;
    signal &lt;= 1 ;
 end

OR
 signal &lt;= 0 ;

 if (count != 10) begin
    count  &lt;= count + 1'b1 ;        
 end

 else begin
    count  &lt;= 0 ;
    signal &lt;= 1 ;
 end

In my Vivado synthesiser, the above code snippets were synthesised to the same netlist, with count != 10 controlling the reset to signal register:

Timing performance is similar for all the code snippets with same path complexity, however the last two code snippets' netlist used two sets of LUTs to control reset to count, and reset to signal register. While the first code snippet's netlist used the same LUT to control reset to count register and set to signal register.
Side note: It's always recommended to use a reset signal to reset all registers in your design.