Unlocking Efficiency in Task-Oriented Dialogue Systems with Self-Training and Constrained Decoding