Non-strict semantics in programming languages allow expressions to be evaluated only when their values are needed, enabling features like lazy evaluation and short-circuiting. This approach can lead to improved performance and flexibility, especially in functional programming paradigms where it helps manage infinite data structures and control flow more efficiently.