Как избавиться от такого дублирования кода?
Такова философия go - явня обработка ошибок. Можно конечно и писать на panic-recover, но будет не менее уродливо и не факт что производительно. Просто привыкните, примите как особенность языка.
Можете вынести идентичные строки в некую функцию ErrorHandler.
Можно воспользоваться panic/recover и модифицировать возвращаемые параметры(если все-таки нужно вернуть ошибку)func myFunc() (err error) {
	defer func() {
		if r := recover(); r != nil {
			log.Println(r)
			internalhttp.NewJsonResponse().ErrorResponse(w, r)
			err = r.(error)
		}
	}()
	
	...
	
	if err := myOtherFunc(); err != nil {
		panic(err)
	}

	return
}