One way to completely avoid syntax is to use Ehrenfeucht–Fraïssé games. If $\mathfrak{A}$ and $\mathfrak{B}$ are two structures with the same signature, then two $k$-tuples $\bar{a}$ and $\bar{b}$ from these respective structures satisfy the same type if and only if duplicator wins every finite length EF game between $(\mathfrak{A},\bar{a})$ and $(\mathfrak{B},\bar{b})$. This is a perfectly semantical way of defining the space $S_k$ of $k$-types for a given signature. One can show directly that the resulting space $S_k$ is a compact zero-dimensional space. The $k$-ary formulas of the language basically correspond to clopen sets in $S_k$. The compactness of $S_0$ is basically a restatement of the Compactness Theorem. Similarly, the Omitting Types Theorem is basically a restatement of the Baire Category Theorem for these spaces $S_k$.
This is the approach used by the Fraïssé school of model theory. One recent book which tries to promote this approach is Bruno Poizat's A Course in Model Theory.