Use a Secret for any value you would not want printed in a build log or checked into git: passwords, tokens, TLS material, signing keys. Use a ConfigMap, which is the unencrypted sibling, for non-sensitive config like feature flags and log levels. The two have nearly identical APIs, so the choice is purely about sensitivity.
The main trade-off is that native Secrets store the actual value in etcd inside your cluster, and that value still has to come from somewhere. If you commit raw Secret YAML to git, you have just leaked the credential. Teams solve this with Sealed Secrets, which encrypt the value so it is safe to commit and only the in-cluster controller can decrypt it, or with the External Secrets Operator, which leaves the real value in a dedicated manager and syncs it into a Kubernetes Secret on demand.
For higher-security setups, many teams skip the etcd copy entirely. The Secrets Store CSI Driver mounts values straight from HashiCorp Vault, AWS Secrets Manager, or Azure Key Vault into the pod at runtime, so the source of truth is an external vault with audit logging and rotation, and Kubernetes is just the delivery mechanism.