### Is there an existing issue for this?

- [X] I have searched the existing issues

### Current Behavior

In AWS, DescribeSubnet Response returns:
```
<?xml version="1.0" encoding="UTF-8"?>\n
    <Response>
        <Errors>
            <Error>
                <Code>InvalidSubnetID.NotFound</Code>
                <Message>The subnet ID \'test\' does not exist</Message>
            </Error>
        </Errors>
    <RequestID>f6d041c1-1c96-4720-af30-77745504e2ba</RequestID>
</Response>
```

whereas localstack returns:
```
<?xml version=\'1.0\' encoding=\'utf-8\'?>\n<Errors xmlns="http://ec2.amazonaws.com/doc/2016-11-15">
    <Error>
        <Code>InvalidSubnetID.NotFound</Code>
        <Message>aaThe subnet ID \'vpc-test\' does not exist</Message>
    </Error>
    <RequestID>EADJHWMM796CI5FT10XGFMGOXIPCBAHBWINMV0HR6SKBRODGCU5J</RequestID>
</Errors>

```

### Expected Behavior

It should return correct response structure. It causes terraform to complain.

### How are you starting LocalStack?

Custom (please describe below)

### Steps To Reproduce

#### How are you starting localstack (e.g., `bin/localstack` command, arguments, or `docker-compose.yml`)

    make start

#### Client commands (e.g., AWS SDK code snippet, or sequence of "awslocal" commands)

     awslocal ec2 describe-subnets --subnet-ids vpc-test --debug


### Environment

```markdown
- OS: M1 MacOS
- LocalStack: 1.0.2.dev
```


### Anything else?

Probably `call_moto` function in `localstack/services/moto.py` is changing the error code structure.
:param parameters: The user input params
        :param response: The final serialized HttpResponse
        :param shape: Describes the expected output shape (can be None in case of an "empty" response)
        :param shape_members: The members of the output struct shape
        ed here
        :return: None - the given `serialized` dict is modified
        """
        response.set_response(
            self._encode_payload(del))
        )
    def _serialize_body_params_to_xml(
        self, params: dict, shape: Shape, operation_model: OperationModel
    ) -> ETree.Element:
        # The Query protocol responses have a root element which is not contained in the specification file.
        # Therefore we first call the super function to perform the normal XML serialization, and afterwards wrap the
        # result in a root element based on the operation name.
        node = super()._serialize_body_params_to_xml(params, shape, operation_model)
        # Check if we need to add a namespace
        attr = (
            {"xmlns": operation_model.metadata.get("xmlNamespace")}
            if "xmlNamespace" in operation_model.metadata
            else None
        )
        # Create the root element and add the result of the XML serializer as a child node
        root = ETree.Element(f"{operation_model.name}Response", attr)
        if node is not None:
            root.append(node)
        return root
    def _prepare_additiin_xml(setional[ET:
        # Add the response metadata here (it's not defined in the specs)