Karlovic, 37, will face either Frenchman Gael Monfils or Alexander Zverev in Sunday's final.
Karlovic, who is 6-foot-11, leads the tournament with 80 aces and no one has broken his serve in 43 games.
In the first set, Karlovic broke Johnson's serve to go up 2-1. It was the only break in the set. Johnson had been 33-for-33 on his serves.
The second set went much the same way with Karlovic again breaking Johnson's serve to lead 2-1. He finished off Johnson with his 14th ace.
Katerina Siniakova advanced to the final after beating defending champion Johanna Larsson 7-5, 6-1 at Bastad, Sweden.
Siniakova, who will play in her first WTA final, faces Laura Siegemund on Sunday.
"It was a really hard match, I just tried to focus on every point and I think I played pretty well," Siniakova said. "Maybe in the beginning I was a little bit nervous, so there were a few more mistakes, but from there my performance was better so I'm really happy."
Siegemund led 4-6, 6-3, 4-0 before forcing Julia Goerges to retire due to a hip injury.
"It was very tough," Siegemund said. "She started out very strongly in the first set. I tried to be solid but it was not enough, she was really the better player at the beginning and I needed to step it up. I felt good out there today, I felt confident to be a bit more risky and go for my shots."
Andrej Martin will play in his first ATP final after beating Carlos Berlocq 7-6(4), 6-4 at Umag.
Martin will play the winner of the Fabio Fognini-Gastao Elias match on Sunday.
Martin and Berlocq both struggled with their serves early on as they recorded six breaks in the first eight games of the first set. They also traded service holds starting at 4-4 until a tie-breaker decided it.
The first three games of the second set were decided on service breaks. Berlocq eventually led 4-2 before Martin charged back to win the next four games and the match.
"It's a long time since my last final here," Lopez said. "I have great memories and it's definitely a great feeling to be in the final here because it means I can still be competitive after 10 years."
Lopez, 34, started off slowly in losing the first set, but stormed back to take the second set to tie the match and clinched it with a strong third set.
Haase and Mathieu held serve throughout the opening set to force a tie-break. Following a rain delay at 3-3 in the tie-break, Haase won the next four points to win the set. After taking a 6-3 lead in the second set, Haase eventually needed to win another tie-break to take the match.
Paolo Lorenzi became the oldest first-time winner on the ATP Tour by topping Nikoloz Basilashvili, 6-3, 6-4 at Kitzbuhel, Austria.
"I think it's great to win an ATP World Tour trophy," Lorenzi said. "I don't look at the age, so I don't mind if it's happening at 34."
Lorenzi won 90 percent of his first serves and 46 percent of returns in the first set. He started and ended the opener by breaking Basilashvili's serve.
He then jumped out to a 3-1 lead in the second set but Basilashvili charged back to close to within 5-4 before closing it out.