Because (at least on some devices) after a call is picked up, the modem sends additional OK<CR><LF><CR><LF> and the query AT+CLCC sees not its expected answer ( +CLCC: 1,0,0,0,0 ), the software interprets this wrongly as "hangup" by the phone and sends also the hangup and not the expected touch tones.
My workaround is, to add a retry for +CLCC in smsd.c, this solved the problem in my case:
--- smsd.c.3.1.21 2010-09-21 11:47:47.000000000 +0200
+++ smsd.c 2018-04-13 07:16:24.000000000 +0200
@@ -4546,6 +4546,7 @@ int send1sms(int* quick, int* errorcount

// 3.1.12:
int was_ringing = 0;
+ int retry_clcc = 0;

wait_time = time(0);

@@ -4592,6 +4593,11 @@ int send1sms(int* quick, int* errorcount
int found_clcc = 0;

p = strstr(answer, "+CLCC:");
+ if ( (!p) && (retry_clcc < 2) ) {
+ retry_clcc++;
+ found_clcc = 1;
+ }
+
while (p)
{
// Check direction, 0 = Mobile Originated: